Computer systems and related technology affect many aspects of daily life in society. Computer systems commonly perform a great variety of tasks (e.g., word processing, scheduling, database management, etc.) that aid in work and business productivity. Such tasks are generally accomplished by processing functions within software applications.
Generally, software application developers design software applications to provide a certain type of functionality. For example, some applications are tailored to word processing; other applications are tailored to data management. Often, users of such software applications desire to tailor the functionality of the application to their specific needs. For example, a user of a data management application may desire to add form processing functionality that was not included in the original application. Such a user could, optionally, pay for a systems integrator to come to the user's office and reconfigure or extend the application to include the desired functionality. Alternatively, if the user's company was large enough to have an IT department, the user could ask his or her IT manager to code in the additional functionality. This may, of course, require a great deal of time from an already busy IT manager. As a last option, the user may opt to write the extension themselves, assuming the user has sufficient knowledge and available time to dedicate to such a task.
In addition to the resource requirements, allowing users to create their own application extensions can be problematic. Many users have neither the time nor the savvy to write a fully functionally application extension. Furthermore, once completed, the extension may only be configured to work on that particular user's computer system. This creates portability problems if other users want to use the extension. For these reasons, many software developers have attempted to allow users to modify their applications without having to write code.
To accomplish this, the developer can do at least one of two things: 1) implement a code generator, where a user inputs or selects a set of rules to be followed when certain actions are performed and the code generator generates the corresponding code for the application extension, or 2) implement a model engine approach where a model of the extension is turned into an object tree such that each object corresponds to the model and the model engine is able to execute the object tree.
The first approach (code generation) has several limitations. For example, it may be difficult to determine which portion of generated code relates to which part of the model. Thus, if a user wanted to use only part of the extension's functionality, it may be difficult to determine which portion to use. Furthermore, when changes are made to the model, the code for the entire extension has to be regenerated which may introduce undesirable processing delays. The second approach (model engine), although widely implemented, is still of limited use. Generally, model engines are only used for relatively simple things such as modeling workflows and corporate business policies. Providing users with the ability to extend and modify applications without using code has proved to be a difficult task.